طباعة وصل الزبون (PrintCustomerReceiptEndpoint)
نظرة عامة
الكلاس هذا مسؤول عن تنفيذ وظيفة طباعة وصل الزبون .(API Endpoint) باستخدام FastEndpoints على الرابط:
POST /checkout/bill/print/customer-receipt
الخطوات اللي يسويها:
- يولّد بيانات الوصل بناءً على رقم الفاتورة.
- يضيف لوكو (شعار) إذا محدد بالإعدادات.
- يرسل الوصل للطابعة اللي موجود اسمها بالإعدادات.
- يحدّث حالة الفاتورة والتاريخ مالها.
هذي تشير إلى ملفات داخلية بالمشروع، مثل:
ReceiptGeneratorHelper: يولد بيانات الوصل.BillHelper: يعدل حالة الفاتورة ويحفظ التاريخ.IPrinterService: يطبع ويجيب الطابعة.AppDbContext: قاعدة البيانات.LocalFileSaverOptions: مسار حفظ الملفات.
تعريف الكلاس
public class PrintCustomerReceiptEndpoint : Endpoint<PrintRequest>
هذا كلاس يمثل API Endpoint، ويستقبل بيانات من نوع PrintRequest.
الكونستركتر (Constructor)
public PrintCustomerReceiptEndpoint(...)
ينحقن بالكلاس مجموعة خدمات (Dependencies):
| الخدمة | وظيفتها |
|---|---|
ReceiptGeneratorHelper | يولد بيانات الوصل. |
BillHelper | يغيّر حالة الفاتورة ويحفظ التاريخ. |
IPrinterService | يتعامل ويا الطابعة. |
AppDbContext | قاعدة البيانات. |
IOptions<LocalFileSaverOptions> | إعدادات لحفظ الملفات. |
دالة Configure()
public override void Configure()
- تحدد الرابط اللي راح يشتغل عليه (
/checkout/bill/print/customer-receipt) - تربطه بصلاحية معينة (
AppPerms.Monitor.PrintCustomerBill)، يعني بس المستخدمين اللي عدهم هاي الصلاحية يقدرون يستعملوه.
دالة HandleAsync
public override async Task HandleAsync(PrintRequest req, CancellationToken ct)
هنا يتم تنفيذ منطق الطباعة:
-
جلب المستخدم من التوكن (JWT).
-
توليد بيانات الوصل من
GenerateReceipt. -
تشييك إذا اكو لوكو (شعار):
- إذا موجود ويا الامتداد ماله، يستخدمه بالوصل.
- إذا لا، يستخدم الوصل بدون لوكو.
-
التأكد من وجود طابعة: إذا اسم الطابعة مو موجود بالإعدادات، يطلع خطأ.
-
المحاولة للطباعة:
- إذا فشلت، يرجع خطأ يقول الطابعة مو موجودة أو مو مربوطة.
-
تحديث حالة الفاتورة إلى
PrintedToCustomer. -
حفظ تاريخ الطباعة بالقاعدة.
-
يرجّع رسالة: "Printed Successfully".
الملاحظات
- لوكو الفاتورة يتم جلبه من جدول
UploadedFiles. - الاسم مال الطابعة يتم جلبه من
AppSettings.InvoiceSettings.PrinterName. - إذا الطابعة مو معرفة، يرجع خطأ فيه رسالة عربية مفهومة للمستخدم.
مثال على رسالة الخطأ
throw new ApiException("PrinterDoesNotExist", "حدث خطأ: لم تتم الطباعة.تأكد من ان الطابعة المحددة في الاعدادات موجودة او متصلة.", 400);
تعني: "صارت مشكلة بالطابعة، تأكد إنها مربوطة وموجودة".